package com.wei800.turnover.config.druid;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

import javax.sql.DataSource;
import java.util.Map;

public class DynamicDataSource extends AbstractRoutingDataSource { // 数据源动态切换
    // 分别保存每一个操作线程所需要的数据源名称，该名称会随着AOP切面不同而有所不同
    private static final ThreadLocal<String> DATASOURCE_CONTEXT_HOLDER =
            new ThreadLocal<>();
    @Override
    protected Object determineCurrentLookupKey() { 		// 获取当前数据源
        return getDataSource();				// 获取当前的DataSource
    }
    static interface DataSourceNames { 			// 数据源名称标记
        String VLAIBAO_DATASOURCE = "vlaibao";
        String VLAIBAO_DIC_DATASOURCE = "vlaibao_dic";
        String VLAIBAO_WEBSITETRAFFIC_DATASOURCE = "vlaibao_websitetraffic";
    }
    /**
     * 配置项目中使用的全部数据源信息
     * @param defaultTargetDataSource 默认数据源实例
     * @param targetDataSources 全部可用的数据源实例集合（key为DataSourceNames中定义的标记）
     */
    public DynamicDataSource(DataSource defaultTargetDataSource,
                             Map<Object, Object> targetDataSources) {
        super.setDefaultTargetDataSource(defaultTargetDataSource); // 设置默认数据源
        super.setTargetDataSources(targetDataSources); 	// 设置可以使用的全部数据源
        super.afterPropertiesSet();				// 配置数据源实例集合
    }
    public static void setDataSource(String dataSourceName) { // 设置数据源标记
        DATASOURCE_CONTEXT_HOLDER.set(dataSourceName);
    }
    public static String getDataSource() { 			// 获取数据源标记
        return DATASOURCE_CONTEXT_HOLDER.get();
    }
    public static void clearDataSource() { 			// 删除数据源标记
        DATASOURCE_CONTEXT_HOLDER.remove();
    }
}
